using System.Diagnostics.Metrics;
using Microsoft.AspNetCore.Mvc;
using System.Diagnostics;

namespace Blogs.Models
{
    public class Linq : Controller{
        // 1-3
        public IActionResult One(){
        // 定义一个数组 
        int [] numbers = {1,2,3,4,5,6};
        // 1. 查询特定元素找出数组中等于5的元素
        var one = numbers.Where(x => x ==5).ToList();
        // 2.查询特定范围的元素 找出数组中在2到8之间的元素
        var two = numbers.Where(x => x>2 && x<8).ToList();
        // 3.查询并转换元素 将数组中的每个数字乘以2(select:可以指定要检索的列，以及应用于这些列的任何条件)
        var three = numbers.Select(x => x*2).ToList();

            return View();
        }
        public IActionResult Two(){
            //定义一个学生集合
            List<Student> students = new List<Student>
            {
                new Student {Id=1, Name = "王有才", Age = 21 },
                new Student {Id=2,  Name = "王中王", Age = 22 },
                new Student {Id=3,  Name = "张语嫣", Age = 23 },
                new Student {Id=4,  Name = "詹宇航", Age = 35 },
                new Student {Id=5,  Name = "郑雨良", Age = 26 },
            };
            //查询特定属性的对象 找出所有名字以"王"开头的学生。
            var one =students.Where(x =>x.Name.Contains("王")).ToList();
            return View();
        }
        public IActionResult Three(){
            List<Student> students = new List<Student>
            {
                //定义一个学生集合
                new Student {Id=1, Name = "王有才", Age = 21 },
                new Student {Id=2, Name = "罗婷", Age = 21 },
                new Student {Id=3,  Name = "王中王", Age = 22 },
                new Student {Id=4,  Name = "李子柒", Age = 22 },
                new Student {Id=5,  Name = "张语嫣", Age = 23 },
                new Student {Id=6,  Name = "詹宇航", Age = 35 },
                new Student {Id=7,  Name = "郑雨良", Age = 26 },
                new Student {Id=8,  Name = "欧文", Age = 26 },
            };
                //查询并排序 找出所有年龄大于20岁的学生，并按年龄降序排列。
                var one = students.Where(x => x.Age>=20).OrderByDescending(x =>x.Age).ToList();
                return View();
        }
        //6-15
        public IActionResult Four(){
            //定义一个数组
            int[] numbers = { 1, 2, 3, 4, 5, 6,18,23,64,7,18,2,3 };
            // 1.查询并去重 找出数组中所有不重复的数字。
            var a = numbers.Distinct().ToList();
            // 2.查询第一个元素 找出数组中第一个大于3的元素。
            var b = numbers.FirstOrDefault(x =>x>3);
            // 3.查询最后一个元素 找出数组中最后一个小于7的元素。
            var c = numbers.LastOrDefault(x =>x<7);
            // 4.查询元素是否存在 检查数组中是否存在大于10的元素
            var d = numbers.Any(x =>x>10);
            // 5.查询元素的计数 计算数组中大于5的元素数量。
            var e = numbers.Count(x =>x>5);
            // 6.查询元素的总和 计算数组中所有元素的总和
            var f = numbers.Sum();
            // 7.查询元素的最大值 找出数组中的最大值。
            var g = numbers.Max();
            // 8.查询元素的最小值 找出数组中的最小值。
            var h = numbers.Min();
            // 9.查询元素的平均值 计算数组中所有元素的平均值。
            double i = numbers.Average();
            // var i = numbers.Sum()/numbers.Length;(方法二)
            // 10.查询特定条件的元素 找出数组中能被3整除的元素
            var j = numbers.Where(x =>x%3 ==0).ToList();
            return View();
        }
        //16-17
        public IActionResult Five(){
            //定义一个学生集合
            List<Student> students = new List<Student>
            {
                new Student {Id=1, Name = "王有才", Age = 21 },
                new Student {Id=2, Name = "罗婷", Age = 21 },
                new Student {Id=3,  Name = "王中王", Age = 22 },
                new Student {Id=4,  Name = "李子柒", Age = 22 },
                new Student {Id=5,  Name = "张语嫣", Age = 23 },
                new Student {Id=6,  Name = "詹宇航", Age = 35 },
                new Student {Id=7,  Name = "郑雨良", Age = 26 },
                new Student {Id=8,  Name = "欧文", Age = 26 },
            };
            // 1.查询并选择特定属性 找出所有学生的姓名和年龄
            var a = students.Select(x =>new{x.Name,x.Age}).ToList();
            // 2.查询并分组 按年龄分组学生，并计算每个年龄组的学生数量。
            var b = students.GroupBy(x =>x.Age).Select(x =>new{age =x.Key,Count=x.Count()}).ToList();
            return View();
        }
        public IActionResult Six(){
            //定义两个学生集合
            List<Student> students = new List<Student>
            {
                new Student {Id=1, Name = "王有才", Age = 21 },
                new Student {Id=2, Name = "罗婷", Age = 21 },
                new Student {Id=3,  Name = "王中王", Age = 22 },
                new Student {Id=4,  Name = "李子柒", Age = 22 },
                new Student {Id=5,  Name = "张语嫣", Age = 23 },
                new Student {Id=6,  Name = "詹宇航", Age = 35 },
                new Student {Id=7,  Name = "郑雨良", Age = 26 },
                new Student {Id=8,  Name = "欧文", Age = 26 },
            };
            List<Course> courses=new List<Course>
            {
                    new Course{StudentId=1,CourseName="英语"},
                    new Course{StudentId=1,CourseName="数学"},
                    new Course{StudentId=2,CourseName="语文"},
                    new Course{StudentId=3,CourseName="物理"},
                    new Course{StudentId=4,CourseName="化学"},
                    new Course{StudentId=4,CourseName="生物"},
                    new Course{StudentId=4,CourseName="语文"},
            };
             //查询并联结 联结学生和课程表，找出每个学生的所有课程。
             var a = from student in students join course in courses on student.Id equals course.StudentId into studentCourses 
             select new{StudentName = student.Name,Courses = studentCourses.Select(c => c.CourseName).ToList()};
             return View(a.ToList());
           
        }
        public IActionResult Seven(){
            //定义一个数组
            int[] numbers = { 1, 2, 3, 4, 5, 6,18,23,64,7,18,2,3 };
            //查询并反转 反转数组中的元素顺序。
            var a = numbers.AsEnumerable().Reverse();
            // 将结果转换回数组
            int[] sever = a.ToArray();
            //查询并填充 找出数组中第一个大于2的元素，并用它填充后面的所有位置。
            int b = numbers.FirstOrDefault(n => n > 2);
            // 如果找到了，用它填充后面的所有位置
            if (b != 0) // 这里使用0是因为b是int类型，它的默认值是0
            {
                int index = Array.IndexOf(numbers, b);
                for (int i = index + 1; i < numbers.Length; i++)
                {
                    numbers[i] = b;
                }
            }
            //查询并排除 从数组中排除所有小于5的元素。
            var c = numbers.Where(n => n >= 5).ToList();
                    return View();
        }
        public IActionResult Eight(){
            //定义一个数组
            int?[] nullableNumbers = { 1, null, 3, null, 5 };
            //查询并填充默认值 如果数组中存在null值，用默认值0替换。
            var a = nullableNumbers.Select(n => n ?? 0).ToList();
            return View();
            
        }
        public IActionResult Nine(){
            //定义一个数组
            string[] stringNumbers = { "1", "2", "3", "4" };
            //查询并转换类型 将字符串数组转换为整数数组。
            int[] a = stringNumbers.Select(int.Parse).ToArray();
            return View();
            
        }
        public IActionResult Ten(){
            //定义一个数组
            object[] objects = { "String", 123, "Another String", 456 };
            var result = objects.OfType<string>().ToList();
            //查询并使用OfType过滤 从对象数组中过滤出字符串类型的元素。
            return View();
            
        }
        public IActionResult Eleven(){
            //定义两个数组
            int[] numbers1 = { 1, 2, 3 };
            int[] numbers2 = { 4, 5, 6 };
            //查询并使用Zip合并 合并两个数组，并创建一个包含元素对的新数组。
            var a = numbers1.Zip(numbers2, (first, second) => new { first, second }).ToList();
            return View();
        }
        public IActionResult Twelve(){
            //查询并使用Range生成 生成一个包含1到10的整数数组
            int[] a = Enumerable.Range(1, 10).ToArray();
            return View(a);
        }
        public IActionResult Thirteen(){
            //查询并使用Repeat重复 重复一个元素多次，创建一个新数组。
            // 要重复的元素
            int number = 7;
            // 重复的次数
            int repeatCount = 10;
            // 使用LINQ的Repeat方法重复元素
            var a = Enumerable.Repeat(number, repeatCount).ToArray();
            // 将结果传递给视图
            return View();
        }
        public IActionResult Fourteen(){
            //查询并使用Skip跳过元素 跳过数组中的前3个元素，然后取出剩余的元素。
            int[] numbers = { 1, 2, 3, 4, 5, 6,18,23,64,7,18,2,3 };
            // 使用LINQ的Skip方法跳过前3个元素
            var a = numbers.Skip(3).ToArray();
            // 将结果传递给视图
            return View();
        }
        public IActionResult Fifteen(){
             //查询并使用Take限制数量 从数组中取出前5个元素。
            int[] numbers = { 1, 2, 3, 4, 5, 6,18,23,64,7,18,2,3 };
            // 使用LINQ的Take方法取出前5个元素
            var a = numbers.Take(5).ToArray();
            // 将结果传递给视图
            return View();
        }
        
    }
}